import { loading, hideLoading } from '@/utils/feedback'

export default class RequestHttp {

    constructor (options={}, ext={}) {
        // 设置拦截器
        this.interceptors = {
            request (fn) {
                RequestHttp.requestBefore = fn
            },
            response (fn) {
                RequestHttp.requestAfter = fn
            }
        }
    }

    static requestBefore (config) {
        return config
    }

    static requestAfter (response) {
        return response
    }

    /**
     * 设置参数配置 （）
     * @param {Object} options 请参考uni 的请求配置
     * @param {String} options.url 请求地址
     * @param {String} options.method 请求类型
     * @param {Object} options.data 请求参数
     * @param {Object} Object ext 附加参数
     * @param {Object} ext.formData 是否是表单提交 (默认否)
     * @param {Boolean} ext.showLogin 是否显示加载（login）状态
     * @param {Boolean} ext.hiddenLogin 是否关闭加载（login）状态
     */
    setConfig (options={}, ext={}) {
        this.options = options
        this.ext = {showLogin: true, hiddenLogin: true, ...ext}

        // 处理options ext
        this.handleParams()
    }

    handleParams () {
        let { url='', method='get', data={}, header={} } = this.options
        let { formData=false } = this.ext

        // 表单提交请求头
        formData && (header = { ...header, 'Content-Type': 'application/x-www-form-urlencoded' })
        // 过滤掉没用的属性
        data = this.filterObj(data)
        // 转大写
        method = method.toUpperCase()

        return this.options = { ...this.options, url, method, data, header }
    }

    /**
     * 请求函数
     * @param {Object} options 请求的对象
     */
    request () {
        let options = this.options
        options = { ...options, ...RequestHttp.requestBefore(options) }
        // 是否显示加载
        this.ext.showLogin && loading()
        return new Promise((resolve, reject) => {
            // 请求成功函数
            options.success = (response) => {
                resolve(RequestHttp.requestAfter(response))
                // 是否隐藏加载
                this.ext.hiddenLogin && hideLoading()
            }
            options.fail = (err) => {
                reject(RequestHttp.requestAfter(err))
                // 是否隐藏加载
                this.ext.hiddenLogin && hideLoading()
            }
            uni.request(options)
        })
    }

    /**
     * get 请求
     */
    get () {

    }

    /**
     * post 请求
     */
    post () {

    }

    /**
     * delete 请求
     */
    delete () {

    }

    /**
     * put 请求
     */
    put () {

    }
}

// 原型
Object.assign(RequestHttp.prototype, {
    /**
     * 过滤掉没用的属性
     * @param {Object} data 要过滤的对象
     */
    filterObj (data) {
        let params = {}
        for (let key in data) {
            data[key] && (params[key] = data[key])
        }
        return params
    }
})
